
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
export default {
  namespaced: true,
  state: {
    cartList: [] // 购物车列表
  },
  // state的计算属性 保证state中数据一变 得到重新计算的新数据
  getters: {
    // 总钱数 单价*数量 做累加
    allPrice (state) {
      return state.cartList.reduce((a, c) => a + c.count * c.price, 0)
    },
    // 总条数 数量做累加
    allCount (state) {
      return state.cartList.reduce((a, c) => a + c.count, 0)
    },
    // 已选择件数 selected === true
    seletedCount (state) {
      return state.cartList
        .filter(item => item.selected === true) // 获取到所有selected为true的列表
        .reduce((a, c) => a + c.count, 0) // 把所有selected为true的项的count累加
    },
    // 已选择的价钱合计  把所有selected为true的项 它的单价*数量累加起来
    selectedPrice (state) {
      return state.cartList
        .filter(item => item.selected === true) // 获取到所有selected为true的列表
        .reduce((a, c) => a + c.count * c.price, 0)
    },
    // 是否全选  逻辑：所有项的selected字段都为true isAll才为true 否则就是false
    isAll (state) {
      return state.cartList.every(item => item.selected === true)
    }
  },
  mutations: {
    setCartList (state, list) {
      state.cartList = list
    },
    changeSelected (state, { sku, selected }) {
      // 1. 使用sku.skuId去 cartList中寻找 找到我们当前要修改的那一项
      // find findIndex
      const curItem = state.cartList.find(item => item.skuId === sku.skuId)
      // 2. 把找到的项的selected字段设置为传入的selected
      curItem.selected = selected
    }
  },
  actions: {
    // 加入购物车
    async insertCart (ctx, { skuId, count }) {
      // 1. 加入购物车接口
      await insertCart({ skuId, count })
      // 2. 获取购物车列表
      const res = await findCartList()
      // 3. 提交mutation函数把列表存起来
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车
    async delCart (ctx, ids) {
      // 1. 删除接口
      await deleteCart(ids)
      // 2. 获取购物车列表
      const res = await findCartList()
      // 3. 提交mutation函数把列表存起来
      ctx.commit('setCartList', res.result)
    },
    // 单选购物车
    async singleCheck (ctx, good) {
      // 1. 单选接口
      await updateCart(good)
      // 2. 获取购物车列表
      const res = await findCartList()
      // 3. 提交mutation函数把列表存起来
      ctx.commit('setCartList', res.result)
    },
    // 全选购物车
    async allCheck (ctx, selected) {
      // 1. 全选接口调用
      await checkAllCart({
        selected,
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 2. 获取购物车列表
      const res = await findCartList()
      // 3. 提交mutation函数把列表存起来
      ctx.commit('setCartList', res.result)
    },
    // 数量修改
    async countChange (ctx, good) {
      // 1. 单选接口
      await updateCart(good)
      // 2. 获取购物车列表
      const res = await findCartList()
      // 3. 提交mutation函数把列表存起来
      ctx.commit('setCartList', res.result)
    }
  }
}
